﻿package mortal.game.scene3D.map3D.AstarAnyDirection.processor
{
    import __AS3__.vec.*;
    import mortal.game.scene3D.map3D.AstarAnyDirection.data.*;

    public class MapGridLinker extends Object
    {

        public function MapGridLinker()
        {
            return;
        }// end function

        public static function calcLink(param1:Vector.<AstarIIPoint>, param2:Vector.<AstarIIPoint>) : Vector.<AstarIIPoint>
        {
            processLeft(param1);
            processRight(param1);
            processTop(param1);
            processBottom(param1);
            processJump(param2);
            return param1;
        }// end function

        private static function processJump(param1:Vector.<AstarIIPoint>) : void
        {
            var _loc_3:AstarIIPoint = null;
            var _loc_4:AstarIIPoint = null;
            var _loc_5:AstarIILink = null;
            if (param1 == null || param1.length == 0)
            {
                return;
            }
            var _loc_2:int = 0;
            while (_loc_2 < param1.length)
            {
                
                _loc_3 = param1[_loc_2];
                _loc_4 = param1[(_loc_2 + 1)];
                _loc_5 = new AstarIILink();
                _loc_5.isJumpLink = true;
                _loc_5.otherNode = _loc_4;
                var _loc_6:* = _loc_3.row;
                _loc_5.maxRow = _loc_3.row;
                _loc_5.minRow = _loc_6;
                var _loc_6:* = _loc_3.col;
                _loc_5.maxCol = _loc_3.col;
                _loc_5.minCol = _loc_6;
                if (_loc_3.links == null)
                {
                    _loc_3.links = [];
                }
                _loc_3.links.push(_loc_5);
                _loc_5 = new AstarIILink();
                _loc_5.isJumpLink = true;
                _loc_5.otherNode = _loc_3;
                var _loc_6:* = _loc_4.row;
                _loc_5.maxRow = _loc_4.row;
                _loc_5.minRow = _loc_6;
                var _loc_6:* = _loc_4.col;
                _loc_5.maxCol = _loc_4.col;
                _loc_5.minCol = _loc_6;
                if (_loc_4.links == null)
                {
                    _loc_4.links = [];
                }
                _loc_4.links.push(_loc_5);
                _loc_2 = _loc_2 + 2;
            }
            return;
        }// end function

        private static function processLeft(param1:Vector.<AstarIIPoint>) : void
        {
            var _loc_3:AstarIIPoint = null;
            var _loc_4:AstarIIPoint = null;
            var _loc_5:Array = null;
            var _loc_6:AstarIILink = null;
            var _loc_2:Array = [];
            sort(param1, _loc_2, "endCol");
            for each (_loc_3 in param1)
            {
                
                _loc_5 = _loc_2[_loc_3.col];
                if (_loc_5 == null)
                {
                    continue;
                }
                for each (_loc_4 in _loc_5)
                {
                    
                    if (_loc_4.row >= _loc_3.endRow)
                    {
                        continue;
                    }
                    if (_loc_3.row >= _loc_4.endRow)
                    {
                        continue;
                    }
                    _loc_6 = new AstarIILink();
                    _loc_6.otherNode = _loc_4;
                    _loc_6.setCommon(_loc_3.row, _loc_3.endRow, _loc_4.row, _loc_4.endRow);
                    var _loc_11:* = _loc_3.col - 0.5;
                    _loc_6.maxCol = _loc_3.col - 0.5;
                    _loc_6.minCol = _loc_11;
                    if (_loc_3.links == null)
                    {
                        _loc_3.links = [];
                    }
                    _loc_6.minRow = _loc_6.minRow - 0.5;
                    _loc_6.maxRow = _loc_6.maxRow - 0.5;
                    _loc_3.links.push(_loc_6);
                }
            }
            return;
        }// end function

        private static function processRight(param1:Vector.<AstarIIPoint>) : void
        {
            var _loc_3:AstarIIPoint = null;
            var _loc_4:AstarIIPoint = null;
            var _loc_5:Array = null;
            var _loc_6:AstarIILink = null;
            var _loc_2:Array = [];
            sort(param1, _loc_2, "col");
            for each (_loc_3 in param1)
            {
                
                _loc_5 = _loc_2[_loc_3.endCol];
                if (_loc_5 == null)
                {
                    continue;
                }
                for each (_loc_4 in _loc_5)
                {
                    
                    if (_loc_4.row >= _loc_3.endRow)
                    {
                        continue;
                    }
                    if (_loc_3.row >= _loc_4.endRow)
                    {
                        continue;
                    }
                    _loc_6 = new AstarIILink();
                    _loc_6.otherNode = _loc_4;
                    _loc_6.setCommon(_loc_3.row, _loc_3.endRow, _loc_4.row, _loc_4.endRow);
                    var _loc_11:* = _loc_3.endCol - 0.5;
                    _loc_6.maxCol = _loc_3.endCol - 0.5;
                    _loc_6.minCol = _loc_11;
                    if (_loc_3.links == null)
                    {
                        _loc_3.links = [];
                    }
                    _loc_6.minRow = _loc_6.minRow - 0.5;
                    _loc_6.maxRow = _loc_6.maxRow - 0.5;
                    _loc_3.links.push(_loc_6);
                }
            }
            return;
        }// end function

        private static function processTop(param1:Vector.<AstarIIPoint>) : void
        {
            var _loc_3:AstarIIPoint = null;
            var _loc_4:AstarIIPoint = null;
            var _loc_5:Array = null;
            var _loc_6:AstarIILink = null;
            var _loc_2:Array = [];
            sort(param1, _loc_2, "endRow");
            for each (_loc_3 in param1)
            {
                
                _loc_5 = _loc_2[_loc_3.row];
                if (_loc_5 == null)
                {
                    continue;
                }
                for each (_loc_4 in _loc_5)
                {
                    
                    if (_loc_4.col >= _loc_3.endCol)
                    {
                        continue;
                    }
                    if (_loc_3.col >= _loc_4.endCol)
                    {
                        continue;
                    }
                    _loc_6 = new AstarIILink();
                    _loc_6.otherNode = _loc_4;
                    _loc_6.setCommon(_loc_3.col, _loc_3.endCol, _loc_4.col, _loc_4.endCol);
                    var _loc_11:* = _loc_3.row - 0.5;
                    _loc_6.maxRow = _loc_3.row - 0.5;
                    _loc_6.minRow = _loc_11;
                    _loc_6.minCol = _loc_6.minCol - 0.5;
                    _loc_6.maxCol = _loc_6.maxCol - 0.5;
                    if (_loc_3.links == null)
                    {
                        _loc_3.links = [];
                    }
                    _loc_3.links.push(_loc_6);
                }
            }
            return;
        }// end function

        private static function processBottom(param1:Vector.<AstarIIPoint>) : void
        {
            var _loc_3:AstarIIPoint = null;
            var _loc_4:AstarIIPoint = null;
            var _loc_5:Array = null;
            var _loc_6:AstarIILink = null;
            var _loc_2:Array = [];
            sort(param1, _loc_2, "row");
            for each (_loc_3 in param1)
            {
                
                _loc_5 = _loc_2[_loc_3.endRow];
                if (_loc_5 == null)
                {
                    continue;
                }
                for each (_loc_4 in _loc_5)
                {
                    
                    if (_loc_4.col >= _loc_3.endCol)
                    {
                        continue;
                    }
                    if (_loc_3.col >= _loc_4.endCol)
                    {
                        continue;
                    }
                    _loc_6 = new AstarIILink();
                    _loc_6.otherNode = _loc_4;
                    _loc_6.setCommon(_loc_3.col, _loc_3.endCol, _loc_4.col, _loc_4.endCol);
                    var _loc_11:* = _loc_3.endRow - 0.5;
                    _loc_6.maxRow = _loc_3.endRow - 0.5;
                    _loc_6.minRow = _loc_11;
                    _loc_6.minCol = _loc_6.minCol - 0.5;
                    _loc_6.maxCol = _loc_6.maxCol - 0.5;
                    if (_loc_3.links == null)
                    {
                        _loc_3.links = [];
                    }
                    _loc_3.links.push(_loc_6);
                }
            }
            return;
        }// end function

        private static function sort(param1:Vector.<AstarIIPoint>, param2:Array, param3:String) : void
        {
            var _loc_4:AstarIIPoint = null;
            var _loc_5:int = 0;
            for each (_loc_4 in param1)
            {
                
                _loc_5 = int(_loc_4[param3]);
                if (param2[_loc_5] == null)
                {
                    param2[_loc_5] = [];
                }
                param2[_loc_5].push(_loc_4);
            }
            return;
        }// end function

    }
}
